#ifndef MY_SHELL_GLOBAL_VARIABLES_H
#define MY_SHELL_GLOBAL_VARIABLES_H

#include <unordered_map>
#include <unordered_set>
#include <map>
#include <vector>
#include <string>
#include <cstdint>

#include "MyShellNamespace.h"
#include "ResourceManager.h"
#include "Trie.h"
#include "JParserNamespace.h"
#include "JNode.h"

MY_SHELL_NAMESPACE_BEGIN
// 当前用户id
extern uid_t cur_uid;

// 当前用户信息
extern struct passwd* cur_user_info;

// 当前主机名
extern std::string cur_host_name;

// 资源管理器
extern mysh::ResourceManager* resource_manager;

// mysh配置信息
extern myjson::JNode my_shell_configurations;

// 用于存储别名(或变量)的unordered_map
extern std::unordered_map<std::string, std::string> alias;

// 用于存储内部命令的unordered_map
extern std::unordered_map<std::string, std::uint32_t> internal_commands;

// 默认的跳过字符
extern char default_skip_char;

// 退出语句
extern std::unordered_map<std::uint32_t, std::string> exit_statement;

// 是否退出主循环
extern bool if_break;

// 退出状态
extern std::uint32_t exit_status;

// 当前命令是否是管道命令
extern bool if_pipe;

// 当前命令是否是赋值命令
extern bool if_alias;

// 当前命令是否需要输入重定向
extern bool if_input_redirection;

// 用于输入重定向的文件名
extern std::string file_to_input_redirection;

// 当前命令是否需要输出重定向
extern bool if_output_redirection;

// 用于输出重定向的文件名
extern std::string file_to_output_redirection;

// 当前进程是否处于后台运行
extern bool if_in_background;

// mysh路径
extern std::string mysh_path;

// 用于存储命令历史记录
extern std::vector<std::string> mysh_history_commands;

// 当前命令历史记录的索引
extern std::int32_t mysh_history_index;

// 命令历史记录文件的文件名
extern std::string mysh_history_file_name;

// 命令历史记录最大能记录的数量
extern std::size_t mysh_history_max_size;

// 配置文件文件名
extern std::string myshrc_file_name;

// 特殊路径
extern std::map<char, std::string> unique_path;

// 外部命令存储路径
extern std::string external_commands_path;

// 用于存储外部命令的命令名
extern std::unordered_set<std::string> external_commands;

// 外部命令字典树
extern myds::Trie* external_commands_trie;

// 系统命令存储路径
extern std::vector<std::string> system_commands_paths;

// 系统命令字典树
extern std::vector<myds::Trie*> system_commands_tries;

// 内部命令字典树
extern myds::Trie* internal_commands_trie;

// 刷新延时
extern std::uint64_t refresh_delay;
MY_SHELL_NAMESPACE_END

#endif // ! MY_SHELL_GLOBAL_VARIABLES_H